package com.company.笔试.tx朋友圈;

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt(); // t组数据
        for (int i = 0; i < t; i++) {
            int n = sc.nextInt(); // n对关系
            HashMap<Integer,Integer> map = new HashMap<>(); // 用户数字 到 数组位置 的映射
            int[] check = new int[n * 2]; // 并查集数组（n对，最多 n * 2 个用户）

            for (int j = 0; j < n * 2; j++) { // 初始化并查集，指向自己
                check[j] = j;
            }

            for (int j = 0; j < n; j++) { // 建立并查集
                int a = sc.nextInt(); // 读入用户对
                int b = sc.nextInt();
                int x = map.getOrDefault(a, map.size()); // 找到映射
                map.put(a, x);
                int y = map.getOrDefault(b, map.size());
                map.put(b, y);

                if (find(check, x) != x && find(check, y) != y) { // 当都有根，从根部联通两并查集，能减少find的次数
                    check[find(check, x)] = find(check, y); // (连接方式未优化）
                } else if (find(check, x) != x) { // 只有一方有根，另一方直接连到根；都没根时一样
                    check[y] = find(check, x);
                } else {
                    check[x] = find(check, y);
                }
            }

            HashMap<Integer,Integer> res = new HashMap<>(); // 并查集根 和 并查集节点个数 的映射
            for (int j = 0; j < n * 2; j++) { // 遍历并查集
                int k = find(check, j); // 找到当前节点的根
                res.put(k, res.getOrDefault(k, 0) + 1); // 节点个数加一
            }

            int max = 0;
            for (Integer value : res.values()) { // 遍历各个并查集的节点个数，找出最大者
                max = Math.max(max, value);
            }

            System.out.println(max); // 打印
        }
    }

    // 查找并查集的根
    private static int find(int[] check, Integer i) {
        if (check[i] != i) { // 当前节点非根
            check[i] = find(check, check[i]); // 当前节点指向根（路径压缩）
        }
        return check[i]; // 返回根
    }
}
